package com.aimusic.client;

import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.util.concurrent.TimeUnit;

/**
 * Redis工具类：处理验证码存储、防刷控制，支持多场景复用
 */
@Component
public class RedisClient {
    @Resource
    private StringRedisTemplate stringRedisTemplate;

    /**
     * 存储验证码到Redis
     * @param key 完整的键（由调用方根据场景生成，如"verify:register:13800138000"）
     * @param str 验证码
     * @param expire 过期时间
     * @param timeUnit 时间单位
     */
    public void setKey(String key, String str, long expire, TimeUnit timeUnit) {
        stringRedisTemplate.opsForValue().set(key, str, expire, timeUnit);
    }

    /**
     * 从Redis获取验证码
     * @param key 完整的键
     * @return 验证码（null表示已过期或不存在）
     */
    public String getKey(String key) {
        return stringRedisTemplate.opsForValue().get(key);
    }

    /**
     * 删除Redis中的验证码（验证成功后调用，防止重复使用）
     * @param key 完整的键
     * @return 是否删除成功
     */
    public Boolean deleteKey(String key) {
        return stringRedisTemplate.delete(key);
    }

    /**
     * 检查并设置发送限制（防刷）
     * @param limitKey 限制键（由调用方根据场景生成，如"limit:register:13800138000"）
     * @param expire 限制时间
     * @param timeUnit 时间单位
     * @return true：可以发送（不在限制期内）；false：不能发送（在限制期内）
     */
    public boolean checkAndSetSendLimit(String limitKey, long expire, TimeUnit timeUnit) {
        // 检查键是否存在（存在则表示在限制期内）
        Boolean exists = stringRedisTemplate.hasKey(limitKey);
        if (exists != null && exists) {
            return false; // 不能发送
        }
        // 不存在则设置键（值无意义，仅用键的存在性和过期时间控制）
        stringRedisTemplate.opsForValue().set(limitKey, "1", expire, timeUnit);
        return true; // 可以发送
    }

    /**
     * 获取验证码剩余有效期
     * @param key 完整的键
     * @return 剩余时间(秒)，-2表示键不存在，-1表示永不过期
     */
    public Long getRemainingTime(String key) {
        return stringRedisTemplate.getExpire(key, TimeUnit.SECONDS);
    }
}
